/* * Copyright (C) 2012 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.example.android.threadsample; import android.content.Intent; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.ShareCompat; import android.support.v4.content.LocalBroadcastManager; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import java.net.MalformedURLException; import java.net.URL; public class PhotoFragment extends Fragment implements View.OnClickListener { // Constants private static final String LOG_TAG = "ImageDownloaderThread"; private static final String PHOTO_URL_KEY = "com.example.android.threadsample.PHOTO_URL_KEY"; PhotoView mPhotoView; String mURLString; ShareCompat.IntentBuilder mShareCompatIntentBuilder; /** * Converts the stored URL string to a URL, and then tries to download the picture from that * URL. */ public void loadPhoto() { // If setPhoto() was called to store a URL, proceed if (mURLString != null) { // Handles invalid URLs try { // Converts the URL string to a valid URL URL localURL = new URL(mURLString); /* * setImageURL(url,false,null) attempts to download and decode the picture at * at "url" without caching and without providing a Drawable. The result will be * a BitMap stored in the PhotoView for this Fragment. */ mPhotoView.setImageURL(localURL, false, null); // Catches an invalid URL format } catch (MalformedURLException localMalformedURLException) { localMalformedURLException.printStackTrace(); } } } /** * Returns the stored URL string * @return The URL of the picture being shown by this Fragment, in String format */ public String getURLString() { return mURLString; } /* * This callback is invoked when users click on a displayed image. The input argument is * a handle to the View object that was clicked */ @Override public void onClick(View view) { // Sends a broadcast intent to zoom the image Intent localIntent = new Intent(Constants.ACTION_ZOOM_IMAGE); LocalBroadcastManager.getInstance(getActivity()).sendBroadcast(localIntent); } /* * This callback is invoked when the Fragment is created. */ @Override public void onCreate(Bundle bundle) { super.onCreate(bundle); } /* * This callback is invoked as the Fragment's View is being constructed. */ @Override public View onCreateView(LayoutInflater inflater, ViewGroup viewGroup, Bundle bundle) { super.onCreateView(inflater, viewGroup, bundle); /* * Creates a View from the specified layout file. The layout uses the parameters specified * in viewGroup, but is not attached to any parent */ View localView = inflater.inflate(R.layout.photo, viewGroup, false); // Gets a handle to the PhotoView View in the layout mPhotoView = ((PhotoView) localView.findViewById(R.id.photoView)); /* * The click listener becomes this class (PhotoFragment). The onClick() method in this * class is invoked when users click a photo. */ mPhotoView.setOnClickListener(this); // If the bundle argument contains data, uses it as a URL for the picture to display if (bundle != null) { mURLString = bundle.getString(PHOTO_URL_KEY); } if (mURLString != null) loadPhoto(); // Returns the resulting View return localView; } /* * This callback is invoked as the Fragment's View is being destroyed */ @Override public void onDestroyView() { // Logs the destroy operation Log.d(LOG_TAG, "onDestroyView"); // If the View object still exists, delete references to avoid memory leaks if (mPhotoView != null) { mPhotoView.setOnClickListener(null); this.mPhotoView = null; } // Always call the super method last super.onDestroyView(); } /* * This callback is invoked when the Fragment is no longer attached to its Activity. * Sets the URL for the Fragment to null */ @Override public void onDetach() { // Logs the detach Log.d(LOG_TAG, "onDetach"); // Removes the reference to the URL mURLString = null; // Always call the super method last super.onDetach(); } /* * This callback is invoked if the system asks the Fragment to save its state. This allows the * the system to restart the Fragment later on. */ @Override public void onSaveInstanceState(Bundle bundle) { // Always call the super method first super.onSaveInstanceState(bundle); // Puts the current URL for the picture being shown into the saved state bundle.putString(PHOTO_URL_KEY, mURLString); } /** * Sets the photo for this Fragment, by storing a URL that points to a picture * @param urlString A String representation of the URL pointing to the picture */ public void setPhoto(String urlString) { mURLString = urlString; } }